#ifndef __APP_BUFFER_H__
#define __APP_BUFFER_H__

#include <stdio.h>
#include <sys/types.h>
#include "log.h"
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

// 自缓冲区结构体
typedef struct
{
    char *data;
    int len;        // 当前数组长度
    int total_size; // 总长度
} sub_buffer_t;

// 主缓冲区结构体
typedef struct
{
    sub_buffer_t *sub_buffer[2];
    int read_index;
    int write_index;
    pthread_mutex_t read_lock;
    pthread_mutex_t swap_lock;
} buffer_t;

/**
 * @brief 初始化缓冲区
 * @param total_size 缓冲区总大小 因为是双缓冲结构，所以总大小为2倍
 * @return 缓冲区指针
 *  创建两个缓冲区，一个用于读，一个用于写 放入一个主缓冲区中
 */
buffer_t *app_buffer_init(int total_size);

/**
 * @brief 往缓冲区写入数据
 * @param buffer 缓冲区指针
 * @param data 写入的数据
 * @param len 写入的数据长度
 * @return 写入成功返回 0，失败返回-1
 * 1 判断是否可以写入数据 比较写入的数据长度和剩余空间大小
 * 2 如果可以写入数据 向尾部拷贝数据 更新当前数据的长度
 */
int app_buffer_write(buffer_t *buffer, char *data, u_int8_t len);

/**
 * @brief 从缓冲区读取数据
 * @param buffer 主缓冲区指针
 * @param read_buff 读取数据的容器 （已开辟的空间）
 * @param buff_len 读取数据容器长度
 * @return 读取成功返回读取的长度，失败返回-1
 * 
 * 1 判断容器i是否能够放一条数据 比较 容器长度 和 当前数据的长度
 * 2 判断当前读缓冲是否为空 要做切换
 * 3 读取数据 --> 从缓冲区开头位置读取一条数据 --> 从缓冲区中删除数据 --> 更新当前数据的长度
 * 4 如果读缓冲区为空 要做切换
 */
int app_buffer_read(buffer_t *buffer, char *read_buff, int buff_len);

// 销毁缓冲区
// 释放子缓冲去数据 在释放主缓冲区
void app_buffer_destroy(buffer_t *buffer);

#endif /* __APP_BUFFER_H__ */
